#include <iostream>
#include <algorithm>
using namespace std;

// class Time
// {
// public:
//     Time(int hour, int min)
//         :_hour(hour)
//         ,_min(min)
//     {}

// private:
// int _hour = 1;
// int _min = 1;
// };

//声明
class Time;
class Date
{
    friend class Time;
public:
    Date( int year = 2, int month = 2, int day = 2)
        :_year(year)
        ,_month(month)
        ,_day(day)
        // ,x(1)
        // ,pre(a)
    {
        cout << "Date()" << endl;
    }

    // static int Getf() // 静态成员函数没有this指针 无法访问非静态成员函数 
    // {
    //     // return f;
    // }

    void Print()
    {
        cout << _year << " " <<  _month << " " << _day  << endl;
    }

    ~Date()
    {
        _year = 0;
        _month = 0;
        _day = 0;
        
        cout << "~Date()" << endl;
    }
class Time//内部类
{
public:
    Time(int hour = 1, int min = 1)
        :_hour(hour)
        ,_min(min)
    {}
    void Print()
    {
        // cout << f << " " << _hour << endl;
    }
private:
int _hour = 1;
int _min = 1;
};

private:
//给定缺省值
    int _year = 1;
    int _month = 1;
    int _day = 1;
    // static int f;
    // Time T = {1, 2};
    //必须给定初始化列表初始化
    // const int x;
    // int& pre;
};

// int Date::f = 1;


// int main()
// {
//     // Date d1(2021, 5, 21);
//     // d1.Print();

//     // //匿名对象  生命周期只在这一行
//     // Date();
//     // int a[9] = {2, 5, 9, 4, 7, 3, 1, 6, 8};
//     // sort(a, a + 9);//默认升序
//     // // greater<int> st;
//     // // sort(a, a + 9, st);
//     // //匿名对象 等同于上
//     // sort(a, a + 9, greater<int>());
//     // Date::Time T(5, 6);
//     // T.Print();

//     // Date* p1 = new Date();
//     // delete p1;

//     // Date* p4 = new Date(1, 2, 3);
//     // delete p4;

//     // Date* p2 = new Date[5];
//     // delete[] p2;

//     // Date* p3 = new Date[3]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
//     // delete[] p3;

//     //定位new(placement new)
//     Date* p1 = new Date(1, 2, 3);
//     delete p1;


//     Date* p2 = (Date*)operator new(sizeof(Date));
//     new(p2)Date(1, 2, 3);//构造

//     p2->~Date();
//     operator delete(p2);
//     return 0;
// }


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// template <class T>
// T Add(const T& left,const T& right)
// {
//     return left + right;
// }

// template <class T1, class T2>
// T2 Add(const T1& left, const T2& right)
// {
//     return left + right;
// }

// // int main()
// // {
// //     int a = 10, b = 20;
// //     double c = 10.1, d = 20.2;
// //     cout << Add(a, b) << endl;
// //     //强制类型转换 推导实例化
// //     cout << Add(a, (int)c) << endl;
// //     cout << Add((double)a, c) << endl;

// //     //显示实例化
// //     cout << Add<int>(a, c) << endl;
// //     cout << Add<double>(a, c) << endl;

// //     cout << Add(a, c) << endl;

// //     return 0;
// // }

// template <class T>
// class Stack
// {
// public:
//     Stack(int n = 4)
//         :_array(new T[n])
//         ,_size(0)
//         ,_capacity(n)
//     {}

//     ~Stack()
//     {
//         delete[] _array;
//         _array = nullptr;
//         _size = _capacity = 0;
//     }

//     void Push(const T& x)
//     {
//         if(_size == _capacity)
//         {
//             T* tmp = new T[_capacity * 2];
//             memcpy(tmp, _array, sizeof(T) * _size);
//             delete[] _array;

//             _array = tmp;
//             _capacity *= 2;
//         }
//         _array[_size++] = x;
//     }

//     void Print()
//     {
//         for(size_t i = 0; i < _size; i++)
//         {
//             cout << _array[i] << " ";
//         }
//         cout << endl;
//     }

//     void Pop()
//     {
//         --_size;
//     }

// private:
//     T* _array;
//     size_t _size;
//     size_t _capacity;
// };

// int main()
// {
//     //类模板都是显式实例化
//     Stack<int> st;
//     st.Push(1);
//     st.Push(2);
//     st.Push(3);
//     st.Push(4);
//     st.Print();

//     st.Pop();
//     st.Print();

// }

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// #include <string>

// int main()
// {
//     string s1;//无参
//     string s2("Hello World");//带参
//     string s3(s2);//拷贝
//     cout << s1 << endl;
//     cout << s2 << endl;
//     cout << s3 << endl;

//     // string s4;
//     // cin >> s4;
//     // cout << s4 << endl;//流插入提取

//     string s5(s2, 6, 5); // pos-6, len-5
//     cout << s5 << endl;

//     string s6("Hello World", 5);
//     cout << s6 << endl;

//     //初始化
//     string s7(7, 'X');
//     cout << s7 << endl;

//     //运算符重载operator[] 修改字符串中对应位置的字符
//     s6[0] = 'x';
//     cout << s6 << endl;
    
//     return 0;
// }